package cc.rengu.igas.share.facade.bean.cups;

import cc.rengu.oltp.service.common.enums.OltpRpcdEnum;
import cc.rengu.oltp.service.model.BizException;

import java.util.Arrays;

/**
 * F0 MTI 报文类型标识符
 *
 * @author fangminwei
 * @date 2021/4/17
 */
@SuppressWarnings("AlibabaEnumConstantsMustHaveComment")
public enum F0_MTIEnum {
    /**
     * 授权类请求/应答报文
     * 预授权请求/应答
     * 预授权撤销（联机、手工）请求/应答
     * 账户验证请求/应答
     * MOTO预授权请求/应答
     * MOTO预授权撤销（联机、手工）请求/应答
     * 汇款验证请求/应答
     * 建立/解除委托关系
     */
    REQ_0100("0100", "请求-授权类"),
    RESP_0110("0110", "应答-授权类"),
    /**
     * 金融类请求/应答报文
     * 余额查询请求/应答
     * 取现请求/应答
     * 存款请求/应答
     * 存款撤销请求/应答
     * 预授权完成（请求）请求/应答
     * 预授权完成撤销请求/应答
     * 消费请求/应答
     * 消费撤销请求/应答
     * 代收请求/应答
     * 代收撤销请求/应答
     * 贷记请求/应答
     * MOTO消费请求/应答
     * MOTO消费撤销请求/应答
     * MOTO预授权完成（请求）请求/应答
     * MOTO预授权完成（请求）撤销请求/应答
     * 转账请求/应答
     * 转入转账请求/应答
     * 转出转账请求/应答
     * 基于UICS借贷记标准的IC卡圈存交易请求/应答
     * 基于UICS借贷记标准的现金充值请求/应答
     * 基于UICS借贷记标准的现金充值撤销请求/应答
     * 汇款请求/应答
     * 磁条卡现金充值请求/应答
     */
    REQ_0200("0200", "请求-金融类"),
    RESP_0210("0210", "应答-金融类"),
    /**
     * 金融通知/应答类报文
     * 存款确认通知/应答
     * 贷记确认通知/应答
     * 转入确认通知/应答
     * 预授权完成（通知）通知/应答
     * 结算通知/应答
     * 退货（联机）通知/应答
     * MOTO退货（联机）通知/应答
     * MOTO预授权完成（通知）通知/应答
     * MOTO结算通知/应答
     * 基于UICS借贷记标准的脱机消费通知/应答
     * 磁条卡现金充值确认/应答
     * 代授权交易联机传输通知/应答
     */
    REQ_0220("0220", "请求-金融通知"),
    RESP_0230("0230", "应答-金融通知"),
    /**
     * 冲正类通知/应答报文
     * 预授权冲正通知/应答
     * 预授权撤销（联机、手工）冲正通知/应答
     * 取现冲正通知/应答
     * 消费冲正通知/应答
     * 消费撤销冲正通知/应答
     * 预授权完成冲正通知/应答
     * 预授权完成撤销冲正通知/应答
     * 转出转账冲正通知/应答
     * MOTO预授权冲正通知/应答
     * MOTO预授权撤销（联机、手工）冲正通知/应答
     * MOTO预授权完成冲正通知/应答
     * MOTO预授权完成撤销冲正通知/应答
     * MOTO消费冲正通知/应答
     * MOTO消费撤销冲正通知/应答
     * 代收冲正通知/应答
     * 代收撤销冲正通知/应答
     * 建立委托/解除委托关系冲正通知/应答
     * 基于UICS借贷记标准的现金充值冲正/应答
     * 基于UICS借贷记标准的现金充值撤销冲正/应答
     */
    REQ_0420("0420", "请求-管理类通知"),
    RESP_0430("0430", "应答-管理类通知"),
    /**
     * 管理类通知/应答报文
     * 可疑欺诈交易通知/应答
     */
    REQ_0620("0620", "请求-管理类通知"),
    RESP_0630("0630", "应答-管理类通知"),
    /**
     * 网络管理类请求/应答报文
     * CUPS重置密钥请求/应答
     */
    REQ_0800("0800", "请求-网络管理类"),
    RESP_0810("0810", "应答-网络管理类"),
    /**
     * 网络管理类通知/应答报文
     * CUPS发送网络管理通知/应答
     * 入网机构发送网络管理通知/应答
     * 入网机构申请重置密钥通知/应答
     * 代授权状态检测/应答
     * 代授权交易联机传输（启动、停止） /应答
     */
    REQ_0820("0820", "请求-网络管理类通知"),
    RESP_0830("0830", "应答-网络管理类通知"),
    ;

    private String code;
    private String desc;

    F0_MTIEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public String getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return code + "-" + desc;
    }

    public static F0_MTIEnum find(String code) {
        F0_MTIEnum result = Arrays.stream(F0_MTIEnum.values())
                .filter(e -> e.getCode().equals(code)).findFirst().orElse(null);

        if (result == null) {
            throw new BizException(OltpRpcdEnum.PARAM_IS_EMPTY_OR_NULL.getRespCode(), "找不到对应的枚举信息" + code);
        }
        return result;
    }
}
